﻿using BaoVeThanhDia.MapFolder.Elements;
using Microsoft.Xna.Framework;

namespace BaoVeThanhDia.MapFolder.VisitorFolder
{
    class SetElementVisitor : Visitor
    {
        private int i, j;
        public void visit(KhoiI khoiI)
        {
            if (khoiI.getHuong().Equals("phai"))
            {
                #region sang phải
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] = 0;
                    }
                    else break;
                }
                Map.curPosi += new Vector2(0, i - 1);
                #endregion
            }
            else if (khoiI.getHuong().Equals("tren"))
            {
                #region lên trên
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.X - i > 0)
                    {
                        Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                Map.curPosi += new Vector2(-(i - 1), 0);
                #endregion
            }
            else if (khoiI.getHuong().Equals("duoi"))
            {
                #region xuống dưới
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.X + i < Map.SizeOfMatrix.X-1)
                    {
                        Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                Map.curPosi += new Vector2(i - 1, 0);
                #endregion
            }
            else
            {
                #region sang trái
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.Y - i > -1)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] = 0;
                    }
                    else break;
                }
                Map.curPosi += new Vector2(0, -(i - 1));
                #endregion
            }
            Map.huong = khoiI.getHuong();
        }
        public void visit(KhoiL khoiL)
        {
            /*
             * Ý tưởng thuật toán
             * Duyệt qua hàng 1 để chuyển đổi từng ô trong mảng, quá phạm vi thì out
             * Nếu hết vòng lặp mà chưa out i> độ dài 1 thì ta duyệt đến hàng 2 còn không thì thay đổi vị trí hiện tại và lấy hướng của hàng 1
             * Duyệt vòng 2, nếu quá phạm vi mảng cũng tự out, sau đó thay đổi vị trí hiện tại và lấy hướng của hàng 2
             */
            if (khoiL.getHuong().Equals("traitren"))//18-02
            {
                #region sang phải rồi đi lên
                for (i = 1; i <= khoiL.getDocao1(); i++)// sang phải
                {
                    if ((int)Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1() && !((int)Map.curPosi.Y + khoiL.getDocao1() == Map.SizeOfMatrix.Y - 1))
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// đi lên
                    {
                        if ((int)Map.curPosi.X - j > 0)
                        {
                            Map.matrix[(int)Map.curPosi.X - j, (int)Map.curPosi.Y + khoiL.getDocao1()] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(-(j - 1), khoiL.getDocao1());
                    Map.huong = "tren";
                }
                else
                {
                    Map.huong = "phai";
                    Map.curPosi += new Vector2(0, (i - 1));
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("traiduoi"))//18-02
            {
                #region sang phải rồi xuống dưới
                for (i = 1; i <= khoiL.getDocao1(); i++)// sang phải
                {
                    if ((int)Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1() && !((int)Map.curPosi.Y + khoiL.getDocao1() == Map.SizeOfMatrix.Y - 1))
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// đi xuống
                    {
                        if ((int)Map.curPosi.X + j < Map.SizeOfMatrix.X-1)
                        {
                            Map.matrix[(int)Map.curPosi.X + j, (int)Map.curPosi.Y + khoiL.getDocao1()] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2((j - 1), khoiL.getDocao1());
                    Map.huong = "duoi";
                }
                else
                {
                    Map.huong = "phai";
                    Map.curPosi += new Vector2(0, (i - 1));
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("phaitren"))//18-02
            {
                #region sang trái rồi lên trên
                for (i = 1; i <= khoiL.getDocao1(); i++)//sang trái
                {
                    if ((int)Map.curPosi.Y - i > 0)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1() && !((int)Map.curPosi.Y - khoiL.getDocao1() == 0))
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// lên trên
                    {
                        if ((int)Map.curPosi.X - j > -1)
                        {
                            Map.matrix[(int)Map.curPosi.X - j, (int)Map.curPosi.Y - khoiL.getDocao1()] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(-(j - 1), -khoiL.getDocao1());
                    Map.huong = "tren";
                }
                else
                {
                    Map.curPosi += new Vector2(0, -khoiL.getDocao1());
                    Map.huong = "trai";
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("phaiduoi"))//18-02
            {
                #region sang trái rồi xuống dưới
                for (i = 1; i <= khoiL.getDocao1(); i++)//sang trái
                {
                    if ((int)Map.curPosi.Y - i > -1)
                    {
                        Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1() && !((int)Map.curPosi.Y - khoiL.getDocao1() == 0))
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// xuống dưới
                    {
                        if ((int)Map.curPosi.X + j < Map.SizeOfMatrix.X-1)
                        {
                            Map.matrix[(int)Map.curPosi.X + j, (int)Map.curPosi.Y - khoiL.getDocao1()] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2((j - 1), -khoiL.getDocao1());
                    Map.huong = "duoi";
                }
                else
                {
                    Map.curPosi += new Vector2(0, -khoiL.getDocao1());
                    Map.huong = "trai";
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("trentrai"))//18-02
            {
                #region xuống dưới rồi sang trái
                for (i = 1; i <= khoiL.getDocao1(); i++) // xuống dưới
                {
                    if ((int)Map.curPosi.X + i < Map.SizeOfMatrix.X-1)
                    {
                        Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1())
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)//sang trái
                    {
                        if ((int)Map.curPosi.Y - j > -1)
                        {
                            Map.matrix[(int)Map.curPosi.X + khoiL.getDocao1(), (int)Map.curPosi.Y - j] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(khoiL.getDocao1(), -(j - 1));
                    Map.huong = "trai";
                }
                else
                {
                    Map.curPosi += new Vector2((i - 1), 0);
                    Map.huong = "duoi";
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("trenphai"))//18-02
            {
                #region xuống dưới rồi sang phải
                for (i = 1; i <= khoiL.getDocao1(); i++) // xuống dưới
                {
                    if ((int)Map.curPosi.X + i < Map.SizeOfMatrix.X-1)
                    {
                        Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1())
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)//sang phải
                    {
                        if ((int)Map.curPosi.Y + j < Map.SizeOfMatrix.Y)
                        {
                            Map.matrix[(int)Map.curPosi.X + khoiL.getDocao1(), (int)Map.curPosi.Y + j] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(khoiL.getDocao1(), (j - 1));
                    Map.huong = "phai";
                }
                else
                {
                    Map.curPosi += new Vector2((i - 1), 0);
                    Map.huong = "duoi";
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("duoiphai"))//18-02
            {
                #region lên trên rồi sang phải
                for (i = 1; i <= khoiL.getDocao1(); i++) // lên trên
                {
                    if ((int)Map.curPosi.X - i > 0)
                    {
                        Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1())
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)//sang phải
                    {
                        if ((int)Map.curPosi.Y + j < Map.SizeOfMatrix.Y)
                        {
                            Map.matrix[(int)Map.curPosi.X - khoiL.getDocao1(), (int)Map.curPosi.Y + j] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(-khoiL.getDocao1(), (j - 1));
                    Map.huong = "phai";
                }
                else
                {
                    Map.curPosi += new Vector2(-(i - 1), 0);
                    Map.huong = "tren";
                }
                #endregion
            }
            else
            {
                #region lên trên rồi sang trái
                for (i = 1; i <= khoiL.getDocao1(); i++) // lên trên
                {
                    if ((int)Map.curPosi.X - i > 0)
                    {
                        Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] = 0;
                    }
                    else break;
                }
                if (i > khoiL.getDocao1())
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)//sang trái
                    {
                        if ((int)Map.curPosi.Y - j > -1)
                        {
                            Map.matrix[(int)Map.curPosi.X - khoiL.getDocao1(), (int)Map.curPosi.Y - j] = 0;
                        }
                        else break;
                    }
                    Map.curPosi += new Vector2(-khoiL.getDocao1(), -(j - 1));
                    Map.huong = "trai";
                }
                else
                {
                    Map.curPosi += new Vector2(-(i - 1), 0);
                    Map.huong = "tren";
                }
                #endregion
            }
        }
    }
}
